'use strict'

/**
 * @desc 这里前两个是用sequelize 查询的实例， 后面两个是用原生
 * @author Jone Xin (鑫帅)
 * @time 2021-12-11 19:57
 * @site 丽水数字大厦
 *
 * @注意
 *  1，注释的格式 注释快捷键 / + shif按住 + ** + 回车
 *  2，代码缩进的规则
 *  3，变量命名的规范
 *  4，代码的逻辑清晰简洁明了
 *  5，日志明确，便于bug回溯
 */

const { DataTypes, Model } = require('sequelize');
const sequelize = require("../lib/db").get_instance().sequelize;

class UserModel extends Model { }

UserModel.init({
    uid: {
        type: DataTypes.INTEGER,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true,
    },
    userName: {
        field: 'user_name',
        type: DataTypes.STRING,
        primaryKey: true
    },
    passWorld: {
        field: 'pass_world',
        type: DataTypes.STRING,
        primaryKey: true
    },
    addr: {
        field: 'addr',
        type: DataTypes.STRING,
        primaryKey: true
    },
    salary: {
        field: 'salary',
        type: DataTypes.DOUBLE,
        primaryKey: true
    },
    age: {
        field: 'age',
        type: DataTypes.INTEGER,
        primaryKey: true
    },
}, {
    freezeTableName: true,
    sequelize: sequelize,
    modelName: 'user',
    timestamps: false
})

/**
 * 根据用户名获取信息
 * @param {Sring} userName 用户名 
 * @returns {Object} userInfo 用户信息
 */
UserModel.getUserInfo = (userName) => {
    const userInfo = UserModel.findOne({
        where: {
            userName
        }
    })

    return userInfo;
}

/**
 * 根据姓模糊匹配到所有以姓开头的人的信息
 * @param {*} lastName 
 */
UserModel.getUserInfoByLastName = (lastName) => {
    const usersInfo = UserModel.findAll({
        where: {
            userName: {
                [Op.startsWith]: lastName, // 相当于like 模糊匹配，具体的规则查询sequelize 文档https://www.sequelize.com.cn/core-concepts/model-querying-basics
            }
        }
    })

    return usersInfo;
}

// 一般对性能要求不高的情况就用sequelize就行了，原生拼接起来很麻烦，但是性能高  这里的注释我就不写了
UserModel.addUser = (userInfo) => {
    const { addr, salary, age, userName, passWorld } = userInfo;
    let addrObj = { key: '', value: '' };
    let salaryObj = { key: '', value: '' };
    let ageObj = { key: '', value: '' };

    if (addr) {
        addrObj.key = ', addr';
        addrObj.value = ` ,${addr}`;
    }
    if (salary) {
        salaryObj.key = ', salary';
        salaryObj.value = ` ,${salary}`;
    }
    if (age) {
        ageObj.key = ', age';
        ageObj.value = ` ,${age}`;
    }
    // 原声插入信息  string 类型的数据必须加 "", int 不用
    const res = sequelize.query(`insert into user (user_name, pass_world ${addrObj.key} ${salaryObj.key} ${addrObj.key}) values ("${userName}", "${passWorld}" "${addrObj.value}" ${salaryObj.value} ${ageObj.value})`, { type: sequelize.QueryTypes.SELECT })

    return res[0].dataValues ? true : false;
}


module.exports = UserModel;